#pip install openpyxl
#1导包
#2创建连接【连接地址、用户名、密码、数据库名、端口3306、编码集utf-8】
#3创建游标  使用连接对象进行创建
#4准备要执行的sql语句
#5执行sql语句、关闭资源（创建的游标、连接（由内到外关））
sql = 'select * from table'#设置sql语句

######################################################################################################################################
import pymysql
db = pymysql.connect(         #创建连接，对象为db
    host='localhost',
    user='root',
    password='root',
    database='company',     #要连接的库名
    port=3306,
    charset='utf8'
)
cursor = db.cursor()         #创建游标
cursor.execute(sql)          #通过游标下的execute(sql语句)来调用sql语句

#data = cursor.fetchall()    #查询时使用data来接收返回的数据，fetchall可返回多条数据，可通过for来循环打印
#print(data)
#db.commit()                  #查询不需要，增删改需要commit来提交

cursor.close()#关闭游标
db.close()#关闭连接
###########################################################################################################################

#使用with来实现自动关闭游标
db = pymysql.connect(host='localhost', user='root', password='123456', database='test_db')
try:
    with db.cursor() as cursor:
        sql = "SELECT * FROM users WHERE id = %s"
        cursor.execute(sql, (1,))
        result = cursor.fetchone()  #fetchone可返回一条数据
        print(result)
    db.commit()  # 对于写操作需要提交
except Exception as e: 
    print("出错：", e)
    db.rollback()#回滚操作 “撤销”之前已执行但未提交的语句
finally:
    db.close()  # 关闭数据库连接
########################################################################################################################

#python异常捕获
try:
    1#这里写要监视的代码
except Exception as e:#e 是一个变量它是刚刚被捕获的异常的实例对象也就是Exception（或其子类）的一个具体对象
    print("出错：", e)
    1#问题提示
finally:
    1#不管监控的代码有没有问题，这里都执行

################################################################################################################
#用类来实现sql操作
DB = DataBase("localhost","root","root",)
class DataBase:
    def __init__(self,database,host='localhost',user='root',password='root',port=3306,charset='utf8'):
        self.host = host
        self.user = user
        self.password = password
        self.database = database
        self.port = port
        self.charset = charset

    def update(self,sql,data=None):
        db = pymysql.connect(
            host = self.host,
            user = self.user,
            password = self.password,
            database = self.database,
            port = self.port,
            charset = self.charset
        )
        try:
            with db.cursor() as cursor:
                cursor.execute(sql,data)
                db.commit()
                print('数据操作成功')
        except Exception as e:
            print("数据操作失败！", e)
            db.rollback()
        finally:
            db.close()

    def select(self, sql,data=None):
        db = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            database=self.database,
            port=self.port,
            charset=self.charset
        )
        try:
            with db.cursor() as cursor:
                cursor.execute(sql,data)
                result = cursor.fetchall()
                return result
        except Exception as e:
            print('数据查询失败！',e)
        finally:
            db.close()
######################################################################################################################

